package com.lyj.util.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.sql.PreparedStatement;

/**
* 数据访问的辅助类:获取连接对象，释放资源
* @author 李艺江
* @version 创建时间：2018年11月27日 下午5:07:55
*/

public class DbHelper {

	//获取连接对象
	//1 定义c3p0的数据库连接池对象
	private static DataSource dataSource = new ComboPooledDataSource();
	
	//保证同一个线程获取的连接对象是单例
	//本地线程槽对象，保存本线程中创建的对象
	private static ThreadLocal<Connection> conPool = new ThreadLocal<Connection>();
	
	
	public static Connection getConnection() throws Exception{
		//从线程槽中获取对象,若无，则还未创建连接对象，获取连接对象，放入线程槽
		Connection con = conPool.get();
		if(con == null) {
			con = dataSource.getConnection();
			conPool.set(con);
		}
		return con;
	}
	
	//释放资源
	public static void closeAll(Connection con,
			PreparedStatement pst,ResultSet rs) throws Exception{
		if(rs!=null){
			rs.close();
		}
		if(pst!=null){
			pst.close();
		}
		if(con!=null){
			con.close();
		}
	}
	
	//关闭连接对象，移除线程槽中对象
	public static void close()throws Exception{
		Connection con = conPool.get();
		if(con != null) {
			con.close();
			conPool.remove();
		}
	}
	
	//封装事务处理的三个方法:开启、提交和回滚事物
	public static void beginTransaction() throws Exception {
		getConnection().setAutoCommit(false);
	}
	
	public static void commitTransaction() throws Exception {
		getConnection().commit();
	}
	
	public static void rollbackTransaction() throws Exception {
		getConnection().rollback();
	}
}
